/*
 * Copyright 1999-2021 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.fastffi.clang;

import com.alibaba.fastffi.CXXHead;
import com.alibaba.fastffi.CXXTemplate;
import com.alibaba.fastffi.FFIGen;
import com.alibaba.fastffi.FFILibrary;
import com.alibaba.fastffi.FFISkip;
import com.alibaba.fastffi.FFITypeFactory;

@FFIGen
@CXXHead("clang/AST/Type.h")
@FFILibrary(value = "clang::Type::Casting", namespace = "llvm")
public interface TypeCasting {
    TypeCastingGen INSTANCE = (TypeCastingGen) FFITypeFactory.getLibrary(TypeCasting.class);
    @CXXTemplate(cxx = {"clang::Type", "clang::AdjustedType"}, java = {"Type", "AdjustedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecayedType"}, java = {"Type", "DecayedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantArrayType"}, java = {"Type", "ConstantArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedArrayType"}, java = {"Type", "DependentSizedArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::IncompleteArrayType"}, java = {"Type", "IncompleteArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VariableArrayType"}, java = {"Type", "VariableArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AtomicType"}, java = {"Type", "AtomicType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AttributedType"}, java = {"Type", "AttributedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BlockPointerType"}, java = {"Type", "BlockPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BuiltinType"}, java = {"Type", "BuiltinType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ComplexType"}, java = {"Type", "ComplexType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecltypeType"}, java = {"Type", "DecltypeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AutoType"}, java = {"Type", "AutoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DeducedTemplateSpecializationType"}, java = {"Type", "DeducedTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentAddressSpaceType"}, java = {"Type", "DependentAddressSpaceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentExtIntType"}, java = {"Type", "DependentExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentNameType"}, java = {"Type", "DependentNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedExtVectorType"}, java = {"Type", "DependentSizedExtVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentTemplateSpecializationType"}, java = {"Type", "DependentTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentVectorType"}, java = {"Type", "DependentVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ElaboratedType"}, java = {"Type", "ElaboratedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtIntType"}, java = {"Type", "ExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionNoProtoType"}, java = {"Type", "FunctionNoProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionProtoType"}, java = {"Type", "FunctionProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::InjectedClassNameType"}, java = {"Type", "InjectedClassNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MacroQualifiedType"}, java = {"Type", "MacroQualifiedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantMatrixType"}, java = {"Type", "ConstantMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedMatrixType"}, java = {"Type", "DependentSizedMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MemberPointerType"}, java = {"Type", "MemberPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PackExpansionType"}, java = {"Type", "PackExpansionType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ParenType"}, java = {"Type", "ParenType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PipeType"}, java = {"Type", "PipeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PointerType"}, java = {"Type", "PointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::LValueReferenceType"}, java = {"Type", "LValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RValueReferenceType"}, java = {"Type", "RValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmPackType"}, java = {"Type", "SubstTemplateTypeParmPackType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmType"}, java = {"Type", "SubstTemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::EnumType"}, java = {"Type", "EnumType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RecordType"}, java = {"Type", "RecordType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateSpecializationType"}, java = {"Type", "TemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateTypeParmType"}, java = {"Type", "TemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfExprType"}, java = {"Type", "TypeOfExprType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfType"}, java = {"Type", "TypeOfType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypedefType"}, java = {"Type", "TypedefType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnaryTransformType"}, java = {"Type", "UnaryTransformType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnresolvedUsingType"}, java = {"Type", "UnresolvedUsingType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VectorType"}, java = {"Type", "VectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtVectorType"}, java = {"Type", "ExtVectorType"})
    <@FFISkip From, To> To cast(From from, @FFISkip To unused);
    @CXXTemplate(cxx = {"clang::Type", "clang::AdjustedType"}, java = {"Type", "AdjustedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecayedType"}, java = {"Type", "DecayedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantArrayType"}, java = {"Type", "ConstantArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedArrayType"}, java = {"Type", "DependentSizedArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::IncompleteArrayType"}, java = {"Type", "IncompleteArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VariableArrayType"}, java = {"Type", "VariableArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AtomicType"}, java = {"Type", "AtomicType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AttributedType"}, java = {"Type", "AttributedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BlockPointerType"}, java = {"Type", "BlockPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BuiltinType"}, java = {"Type", "BuiltinType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ComplexType"}, java = {"Type", "ComplexType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecltypeType"}, java = {"Type", "DecltypeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AutoType"}, java = {"Type", "AutoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DeducedTemplateSpecializationType"}, java = {"Type", "DeducedTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentAddressSpaceType"}, java = {"Type", "DependentAddressSpaceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentExtIntType"}, java = {"Type", "DependentExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentNameType"}, java = {"Type", "DependentNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedExtVectorType"}, java = {"Type", "DependentSizedExtVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentTemplateSpecializationType"}, java = {"Type", "DependentTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentVectorType"}, java = {"Type", "DependentVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ElaboratedType"}, java = {"Type", "ElaboratedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtIntType"}, java = {"Type", "ExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionNoProtoType"}, java = {"Type", "FunctionNoProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionProtoType"}, java = {"Type", "FunctionProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::InjectedClassNameType"}, java = {"Type", "InjectedClassNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MacroQualifiedType"}, java = {"Type", "MacroQualifiedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantMatrixType"}, java = {"Type", "ConstantMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedMatrixType"}, java = {"Type", "DependentSizedMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MemberPointerType"}, java = {"Type", "MemberPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PackExpansionType"}, java = {"Type", "PackExpansionType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ParenType"}, java = {"Type", "ParenType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PipeType"}, java = {"Type", "PipeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PointerType"}, java = {"Type", "PointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::LValueReferenceType"}, java = {"Type", "LValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RValueReferenceType"}, java = {"Type", "RValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmPackType"}, java = {"Type", "SubstTemplateTypeParmPackType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmType"}, java = {"Type", "SubstTemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::EnumType"}, java = {"Type", "EnumType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RecordType"}, java = {"Type", "RecordType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateSpecializationType"}, java = {"Type", "TemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateTypeParmType"}, java = {"Type", "TemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfExprType"}, java = {"Type", "TypeOfExprType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfType"}, java = {"Type", "TypeOfType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypedefType"}, java = {"Type", "TypedefType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnaryTransformType"}, java = {"Type", "UnaryTransformType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnresolvedUsingType"}, java = {"Type", "UnresolvedUsingType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VectorType"}, java = {"Type", "VectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtVectorType"}, java = {"Type", "ExtVectorType"})
    <@FFISkip From, To> To dyn_cast(From from, @FFISkip To unused);
    @CXXTemplate(cxx = {"clang::Type", "clang::AdjustedType"}, java = {"Type", "AdjustedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecayedType"}, java = {"Type", "DecayedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantArrayType"}, java = {"Type", "ConstantArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedArrayType"}, java = {"Type", "DependentSizedArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::IncompleteArrayType"}, java = {"Type", "IncompleteArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VariableArrayType"}, java = {"Type", "VariableArrayType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AtomicType"}, java = {"Type", "AtomicType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AttributedType"}, java = {"Type", "AttributedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BlockPointerType"}, java = {"Type", "BlockPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::BuiltinType"}, java = {"Type", "BuiltinType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ComplexType"}, java = {"Type", "ComplexType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DecltypeType"}, java = {"Type", "DecltypeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::AutoType"}, java = {"Type", "AutoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DeducedTemplateSpecializationType"}, java = {"Type", "DeducedTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentAddressSpaceType"}, java = {"Type", "DependentAddressSpaceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentExtIntType"}, java = {"Type", "DependentExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentNameType"}, java = {"Type", "DependentNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedExtVectorType"}, java = {"Type", "DependentSizedExtVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentTemplateSpecializationType"}, java = {"Type", "DependentTemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentVectorType"}, java = {"Type", "DependentVectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ElaboratedType"}, java = {"Type", "ElaboratedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtIntType"}, java = {"Type", "ExtIntType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionNoProtoType"}, java = {"Type", "FunctionNoProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::FunctionProtoType"}, java = {"Type", "FunctionProtoType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::InjectedClassNameType"}, java = {"Type", "InjectedClassNameType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MacroQualifiedType"}, java = {"Type", "MacroQualifiedType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ConstantMatrixType"}, java = {"Type", "ConstantMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::DependentSizedMatrixType"}, java = {"Type", "DependentSizedMatrixType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::MemberPointerType"}, java = {"Type", "MemberPointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PackExpansionType"}, java = {"Type", "PackExpansionType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ParenType"}, java = {"Type", "ParenType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PipeType"}, java = {"Type", "PipeType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::PointerType"}, java = {"Type", "PointerType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::LValueReferenceType"}, java = {"Type", "LValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RValueReferenceType"}, java = {"Type", "RValueReferenceType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmPackType"}, java = {"Type", "SubstTemplateTypeParmPackType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::SubstTemplateTypeParmType"}, java = {"Type", "SubstTemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::EnumType"}, java = {"Type", "EnumType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::RecordType"}, java = {"Type", "RecordType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateSpecializationType"}, java = {"Type", "TemplateSpecializationType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TemplateTypeParmType"}, java = {"Type", "TemplateTypeParmType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfExprType"}, java = {"Type", "TypeOfExprType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypeOfType"}, java = {"Type", "TypeOfType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::TypedefType"}, java = {"Type", "TypedefType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnaryTransformType"}, java = {"Type", "UnaryTransformType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::UnresolvedUsingType"}, java = {"Type", "UnresolvedUsingType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::VectorType"}, java = {"Type", "VectorType"})
    @CXXTemplate(cxx = {"clang::Type", "clang::ExtVectorType"}, java = {"Type", "ExtVectorType"})
    <@FFISkip From, To> boolean isa(From from, @FFISkip To unused);
}
